package com.candy.dao;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBHelper {
    /**
     * 连接对象获取
     */
    public static Connection getConn(){
        Connection conn=null;
        try {
//        1、注册实例化驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
//            2、获取链接对象
            String url="jdbc:mysql://localhost:3306/sjt_mysql0922?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
//            mysql的用户名  一般是root
            String username="root";
//            数据库密码，根据自己的密码填写即可
            String userpwd="123456";
            conn= DriverManager.getConnection(url,username,userpwd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
//        将对象返回
        return conn;
    }

    /**
     * 封装查询操作
     */
    public static List<Map<String,Object>> query4ListMap(String strSQL){
        List<Map<String,Object>> lm=null;
//        在jdk1.8之后，try后面的括号中的对象若继承了autocloseable接口，在方法执行完毕后，会自动调用close方法
        try(
                //        获取链接对象
                Connection conn=getConn();
//        获取Statement对象
                Statement ment=conn.createStatement();
//      （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
                ResultSet re= ment.executeQuery(strSQL);
                ) {

//        （5）解析结果集对象ResultSet，进行相关的业务处理；
//        注意： mysql5和mysql8的连接字符串不一样； 在使用5.x的版本:
//            re.next()如果当前行有数据则返回true，若当前行没有收据，返回false

//            资源关闭后，不能在进行获取，此处需要对数据进行转储
//            准备进行存储数据的容器 采用list+map的方式进行转储
           lm=new ArrayList<>();
//获取表结构信息
            ResultSetMetaData rm=re.getMetaData();
//            获取表格共有多少个列
            int count=rm.getColumnCount();
//            准备map存储每一行的数据
            Map<String,Object> eachRow=null;
//进行数据遍历
            while (re.next()){
                eachRow=new HashMap<>();
//                进行遍历每一行的数据，放在map中
                for (int i = 1; i <= count ; i++) {
//                    rm.getColumnName(i)获取该列的列名，re.getObject(rm.getColumnName(i))通过列名获取该列的值
                    eachRow.put(rm.getColumnName(i),re.getObject(rm.getColumnName(i)));
                }
                lm.add(eachRow);
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
            return lm;
    }
    /**
     * 封装增删改操作
     */
    public static void update(String strSQL){
        try(
  //        获取链接对象
            Connection conn=getConn();
//        获取Statement对象
            Statement ment=conn.createStatement();) {

            ment.executeUpdate(strSQL);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }



}
